package modelo.AlgoHero;

import java.util.ArrayList;
import java.util.Iterator;

import modelo.Excepciones.*;

public class PartituraTraducida extends ObjetoTraducido {

	private final ArrayList <ElementoReproducible> lista;
	private Iterator <ElementoReproducible> iterador = null;
	
	/**
	 * Constructor
	 * @author Hernan G Gonzalez
	 */
	public PartituraTraducida() {
		
		this.lista = new ArrayList <ElementoReproducible> ();
		
	}
	
	/**
	 * @param e
	 * @author Hernan G Gonzalez
	 */
	public void add (ElementoReproducible e){
		
		this.lista.add(e);
		
	}
	
	/**
	 * Metodo que devuelve el proximo conjunto reproducible. Si no hubiera mas lanza excepcion
	 * @throws ObjetoSinMasElementosExcepcion 
	 */

	public ConjuntoElementosReproducibles getConjuntoReproducible() throws ObjetoSinMasElementosExcepcion{
	
		if (this.iterador == null) this.iterador = this.lista.iterator();
		
		if (this.iterador.hasNext()==false) throw new ObjetoSinMasElementosExcepcion ();
		
		ConjuntoElementosReproducibles conjunto = new ConjuntoElementosReproducibles ();
		conjunto.add(this.iterador.next());
		
		return conjunto;
	}
	
	/**
	 * Metodo que devuelve un booleano indicando si la partitura tiene elementos sin recorrer
	 */
	public Boolean hasNext(){
		
		if (this.iterador == null) this.iterador = this.lista.iterator();
		
		return this.iterador.hasNext();
		
	}
	
	/**
	 * Metodo que se utiliza para comparar una Partitura Traducida con otra.
	 * Devuelve true si contienen los mismos datos, y false de lo contrario
	 */
	
 	public Boolean compareTo(ObjetoTraducido p){
		
		while (this.hasNext()){
			
			if (!p.hasNext()) return false;
			
			try {
					if (this.getConjuntoReproducible().compareTo(p.getConjuntoReproducible())==false) return false;
				
			} catch (ObjetoSinMasElementosExcepcion e) {
				e.printStackTrace();
				return false;
			}
			
		}
		if (p.hasNext()) return false;
		
		return true;
	}
 
}
